package com.xian.d1_set;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * 目标:
 * 观察Treeset对于有值特性的数据如何排序。
 * 学会对自定义类型的对象进行指定规则排序
 * <p>
 * TreeSet集合默认的规则
 * 对于数值类型: Integer , Double，官方默认按照大小进行升序排序。
 * 对于字符串类型:默认按照首字符的编号升序排序。
 * 对于自定义类型如Student对象，TreeSet无法直接排序。
 * <p>
 * 结论:想要使用TreeSet储自定义类型，需要制定排序规则
 *
 * 1. TreeSet集合的特点是怎么样的?
 * 可排序、不重复、无索引
 * 底层基于红黑树实现排序，增删改查性能较好
 *
 * 2.Treeset集合自定义排序规则有几种方式
 * 2种。
 * 类实现Comparable接口，重写比较规则。
 * 集合自定义Comparator比较器对象，重写比较规则。
 *
 *
 *
 * 1．如果希望元素可以重复，又有索引，索引查询要快?
 * 用ArrayList集合，基于数组的。(用的最多)
 * 2．如果希望元素可以重复，又有索引，增删首尾操作快?
 * ●用LinkedList集合，基于链表的。
 * 3．如果希望增删改查都快，但是元素不重复、无序、无索引。
 * ●用HashSet集合，基于哈希表的。
 * 4．如果希望增删改查都快，但是元素不重复、有序、无索引。
 * 用LinkedHashSet集合，基于哈希表和双链表。
 * 5．如果要对对象进行排序。
 * 用Treeset集合，基于红黑树。后续也可以用List集合实现排序。
 */
public class SetDemo5 {
    public static void main(String[] args) {
        Set<Integer> sets = new TreeSet<>();  //不重复﹐无索引  可排序
        sets.add(23);
        sets.add(25);
        sets.add(12);
        sets.add(8);
        System.out.println(sets);

        Set<String> sets1 = new TreeSet<>();  //不重复﹐无索引  可排序
        sets1.add("Java");
        sets1.add("Java");
        sets1.add("age");
        sets1.add("Python");
        sets1.add("About");
        sets1.add("贤");
        sets1.add("UI");
        System.out.println(sets1);

        System.out.println("----------------------------------");

        //方式二:集合自带比较器对象进行规则定制
        //注意:如果TreeSet集合存储的对象有实现比较规则，集合也自带比较器，默认使用集合自带的比较器排序。---就近原则
        /**
         *        Set<Apple> apples = new TreeSet<>(new Comparator<Apple>() {
         *             @Override
         *             public int compare(Apple o1, Apple o2) {
         *                 //return o1.getWeight()-o2.getWeight();  //升序
         *                 //return o2.getWeight()-o1.getWeight();  //降序
         *
         *                 //注意:浮点型建议直接使用Double.compare进行比较
         *                 //return o2.getPrice()-o1.getPrice();  //double类型不能这样
         *                 return Double.compare(o2.getPrice(), o1.getPrice());  //double类型应该这样
         *             }
         *         });
         */

        Set<Apple> apples = new TreeSet<>(( o1,  o2)->Double.compare(o2.getPrice(), o1.getPrice()));

        apples.add(new Apple("红富士", "红色", 9.9, 500));
        apples.add(new Apple("青苹果", "绿色", 19.9, 300));
        apples.add(new Apple("黄苹果", "黄色", 6.9, 400));
        apples.add(new Apple("绿苹果", "青色", 9.8, 500));

        System.out.println(apples);

    }
}
